package com.chenjunlin.shortlink.admin.service.Impl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.chenjunlin.shortlink.admin.common.convention.exception.ClientException;
import com.chenjunlin.shortlink.admin.common.enums.GroupErrorCode;
import com.chenjunlin.shortlink.admin.common.userContext.UserContext;
import com.chenjunlin.shortlink.admin.dao.entity.GroupDO;
import com.chenjunlin.shortlink.admin.dao.mapper.GroupMapper;
import com.chenjunlin.shortlink.admin.dto.reqtDTO.GroupAddReqDTO;
import com.chenjunlin.shortlink.admin.dto.reqtDTO.GroupPageReqDTO;
import com.chenjunlin.shortlink.admin.dto.reqtDTO.GroupUpdateReqDTO;
import com.chenjunlin.shortlink.admin.service.GroupService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class GroupServiceImpl extends ServiceImpl<GroupMapper, GroupDO> implements GroupService {



    /**
     * 新增分组
     * @param groupAddReqDTO
     * @return
     */
    @Override
    public void add(GroupAddReqDTO groupAddReqDTO) {

        if(validGid(groupAddReqDTO.getGid()).equals(Boolean.FALSE)) {
            throw new ClientException(GroupErrorCode.GROUP_ALREADY_EXISTS);
        }
            GroupDO groupDO = GroupDO.builder()
                    .username(UserContext.getUsername())
                    .gid(groupAddReqDTO.getGid())
                    .sortOrder(0)
                    .name(groupAddReqDTO.getName())
                    .build();
            baseMapper.insert(groupDO);

    }

    @Override
    public IPage<GroupDO> pageResult(GroupPageReqDTO pageReqDTO) {
        LambdaQueryWrapper<GroupDO> queryWrapper = Wrappers.lambdaQuery(GroupDO.class)
                .eq(GroupDO::getDelFlag, 0);
        IPage<GroupDO> iPage = baseMapper.selectPage(pageReqDTO, queryWrapper);
        //此处可以直接return iPage， 如果需要返回特定的respDTO 可以用如下的转换
        return iPage.convert(each -> BeanUtil.toBean(each,GroupDO.class));


    }

    /**
     * 分组修改功能
     */
    @Override
    public void updateByDTO(GroupUpdateReqDTO groupUpdateReqDTO) {
        LambdaUpdateWrapper<GroupDO> updateWrapper = Wrappers.lambdaUpdate(GroupDO.class)
                .eq(GroupDO::getUsername, UserContext.getUsername())
                .eq(GroupDO::getGid, groupUpdateReqDTO.getGid())
                .eq(GroupDO::getDelFlag, 0);
        GroupDO groupDO = new GroupDO();
        groupDO.setName(groupUpdateReqDTO.getName());
        baseMapper.update(groupDO,updateWrapper);
    }

    /**
     * 根据gid删除分组
     * @param gid
     * @return
     */
    @Override
    public void deleteByGid(String gid) {
        LambdaUpdateWrapper<GroupDO> updateWrapper = Wrappers.lambdaUpdate(GroupDO.class)
                .eq(GroupDO::getUsername, UserContext.getUsername())
                .eq(GroupDO::getGid, gid)
                .eq(GroupDO::getDelFlag, 0);
        GroupDO groupDO = new GroupDO();
        groupDO.setDelFlag(1);
        baseMapper.update(groupDO,updateWrapper);
    }

    /**
     * 验证gid是否可用
     * @param gid
     * @return
     */
    public Boolean validGid(String gid) {
       LambdaQueryWrapper<GroupDO> queryWrapper = Wrappers.lambdaQuery(GroupDO.class)
               .eq(GroupDO::getGid, gid);
       GroupDO groupDO = baseMapper.selectOne(queryWrapper);
       return groupDO == null ;
   }

}
